package com.styletransfer.mapper;

import com.styletransfer.model.Favorite;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 收藏Mapper接口
 * 
 * 这个接口定义了与收藏表相关的数据库操作方法。
 * 收藏表记录了用户对风格、组合或作品的收藏关系。
 */
@Mapper
public interface FavoriteMapper {
    
    /**
     * 根据ID查询收藏
     * 
     * @param id 收藏ID
     * @return 收藏对象
     */
    @Select("SELECT * FROM favorite WHERE id = #{id}")
    Favorite findById(Long id);
    
    /**
     * 查询用户的收藏
     * 
     * @param userId 用户ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @return 收藏列表
     */
    @Select("SELECT * FROM favorite WHERE userId = #{userId} AND type = #{type} ORDER BY id DESC")
    List<Favorite> findByUser(@Param("userId") Long userId, @Param("type") Integer type);
    
    /**
     * 查询用户是否已收藏
     * 
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @return 收藏对象，如果不存在则返回null
     */
    @Select("SELECT * FROM favorite WHERE userId = #{userId} AND targetId = #{targetId} AND type = #{type}")
    Favorite findByUserAndTarget(@Param("userId") Long userId, @Param("targetId") Long targetId, @Param("type") Integer type);
    
    /**
     * 插入收藏
     * 
     * @param favorite 收藏对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO favorite(userId, targetId, type, createTime) " +
            "VALUES(#{userId}, #{targetId}, #{type}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Favorite favorite);
    
    /**
     * 删除收藏
     * 
     * @param id 收藏ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM favorite WHERE id = #{id}")
    int delete(Long id);
    
    /**
     * 删除用户的收藏
     * 
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @return 影响的行数
     */
    @Delete("DELETE FROM favorite WHERE userId = #{userId} AND targetId = #{targetId} AND type = #{type}")
    int deleteByUserAndTarget(@Param("userId") Long userId, @Param("targetId") Long targetId, @Param("type") Integer type);
    
    /**
     * 统计目标的收藏数
     * 
     * @param targetId 目标ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @return 收藏数
     */
    @Select("SELECT COUNT(*) FROM favorite WHERE targetId = #{targetId} AND type = #{type}")
    Long countByTarget(@Param("targetId") Long targetId, @Param("type") Integer type);
    
    /**
     * 统计用户的收藏数
     * 
     * @param userId 用户ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @return 收藏数
     */
    @Select("SELECT COUNT(*) FROM favorite WHERE userId = #{userId} AND type = #{type}")
    Long countByUser(@Param("userId") Long userId, @Param("type") Integer type);
    
    /**
     * 分页查询用户的收藏
     * 
     * @param userId 用户ID
     * @param type 收藏类型（1:风格, 2:组合, 3:作品）
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 收藏列表
     */
    @Select("SELECT * FROM favorite WHERE userId = #{userId} AND type = #{type} ORDER BY id DESC LIMIT #{offset}, #{limit}")
    List<Favorite> findByUserAndPage(@Param("userId") Long userId, @Param("type") Integer type, @Param("offset") Integer offset, @Param("limit") Integer limit);
}
